# from django.shortcuts import render
from django.views import View
from QQLoginTool.QQtool import OAuthQQ
from django.conf import settings
from django import http
import logging, json
from apps.oauth.models import OAuthQQUser
from apps.users.models import User
from django.contrib.auth import login
#
logger = logging.getLogger('django')

# Create your views here
'''
获取 QQ 登录扫码页面接口
这是 QQ 登录的第一次请求接口:

1. 请求方式
选项	方案
请求方法	GET
请求地址	/qq/authorization
2. 请求参数：查询参数
参数名	类型	是否必传	说明
next	string	否	用于记录 QQ 登录成功后进入的网址
3.响应结果：JSON
字段	说明
code	状态码
errmsg	错误信息
login_url	QQ 登录扫码页面链接

'''


class QQauthView(View):

    def get(self, request):
        next = request.GET.get('next')
        print('ok')
        # 创建qq对象 OAuthQQ 传入　client_id=settings.QQ_CLIENT_ID,
        #                         client_secret=settings.QQ_CLIENT_SECRET,
        #                         redirect_uri=settings.QQ_REDIRECT_URI,
        #                         state=next)

        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI,
                        state=next)

        # 调用方法返回链接 get_qq_ur

        redirect_url = oauth.get_qq_url()
        print(redirect_url)

        response = http.JsonResponse({'code': 0, 'errmsg': 'ok', 'login_url': redirect_url})

        return response


# 第二个接口，登录成功后返回回调地址

class QQcallbackView(View):
    '''
    .请求方式
选项	方案
请求方法	GET
请求地址	/oauth_callback/
2. 请求参数：查询参数
参数名	类型	是否必传	说明
code	string	是	QQ 发送过来用于验证的字段
3.响应结果：
登录成功:

字段	说明
登录成功	返回0的状态码和ok信息(前端会跳转到首页)
登录不成功:

字段	说明
access_token	将 openid 加密为access_token 并返回

    '''

    def get(self, request):
        # 判断是否有code
        code = request.GET.get('code')
        if not code:
            return http.JsonResponse({'code': 400, 'errmsg': '缺少code'})

        # 想办法获取assess_token
        # 创建QQ对象
        qq = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                     client_secret=settings.QQ_CLIENT_SECRET,
                     redirect_uri=settings.QQ_REDIRECT_URI,
                     state=next)

        try:
            # 携带 code 向 QQ服务器 请求 access_token --- get_access_token
            access_token = qq.get_access_token(code)
            # 携带 access_token 向 QQ服务器 请求 openid --- get_open_id
            openid = qq.get_open_id(access_token=access_token)

        # 获取失败
        except Exception as e:
            logger.error(e)
            return http.JsonResponse({'code': 400, 'errmsg': '网络不佳,请重试'})

        # 判断是否绑定用户
        qq_object = OAuthQQUser.objects.filter(openid=openid)

        if not qq_object:
            from meiduo_mall.utils.encrypt import itsdangerous
            access_token = itsdangerous.serilize(openid)

            print('fuck')
            return http.JsonResponse({'code': 300,
                                      'errmsg': 'ok',
                                      'access_token': access_token})

        # 假如已经绑定获取登录qq对应的用户,状态保持
        user = qq_object.user

        login(request, user)
        response = http.JsonResponse({'code': 0, 'errmsg': 'ok'})
        response.set_cookie('username', user.username)

        return response

    # 绑定用户

    '''
后端接口设计
请求方式：
POST /oauth_callback/

请求参数： json

参数	类型	是否必须	说明
mobile	str	是	手机号
password	str	是	密码
sms_code	str	是	短信验证码
access_token	str	是	凭据 （包含 openid )
返回数据： JSON

返回值	类型	是否必须	说明
code	int	是	状态码
errmsg	str	是	错误信息
    '''

    def post(self, request):

        parameters = json.loads(request.body.decode())

        mobile = parameters.get('mobile')
        password = parameters.get('password')
        sms_code = parameters.get('sms_code')
        access_token = parameters.get('access_token')

        if not all([mobile, password, sms_code, access_token]):
            return http.JsonResponse({'code': 400, 'errmsg': '缺少必传参数'})

        # 正则匹配,不想写

        # 提取access_token,从而得到openid
        from meiduo_mall.utils.encrypt import itsdangerous
        openid_dict = itsdangerous.unserilize(access_token)
        if openid_dict:
            openid = openid_dict.get('key')

        # 注册用户到tb_user
        try:
            user = User.objects.create_user(username=mobile, password=password)

        except Exception as e:
            return http.JsonResponse({'code': 400, 'errmsg': '注册失败'})

        # 注册(绑定)用户到tb_oauth_qq
        try:
            qquser = OAuthQQUser.objects.create(openid=openid, user=user)

        except Exception as e:
            return http.JsonResponse({'code': 400, 'errmsg': '注册失败'})

        # 状态保持
        login(request, user)

        response = http.JsonResponse({'code': 0, 'errmsg': 'ok'})

        response.set_cookie('username',user.username)

        return response





